//============================================================================================
/**
 * @file	phclink_recvdemo.c
 * @brief	ＰＨＣ−ＤＳ接続画面 受信デモ画面 【シーケンス】
 * @author	Akito Mori
 * @date	09.02.02
 */
//============================================================================================
#include "common.h"
#include "gflib/touchpanel.h"
#include "system/gamedata.h"
#include "system/procsys.h"
#include "system/main.h"
#include "system/fontproc.h"
#include "system/window.h"
#include "system/pmfprint.h"
#include "system/snd_tool.h"
#include "system/arc_tool.h"
#include "system/arc_util.h"
#include "system/clact_tool.h"
#include "system/clact_util.h"
#include "system/msgdata.h"
#include "system/wordset.h"
#include "system/mystatus.h"
#include "system/wipe.h"
#include "savedata/config.h"
#include "gflib/strbuf_family.h"
#include "itemtool/item.h"
#include "itemtool/myitem.h"
#include "msgdata/msg.naix"
#include "msgdata/msg_phc_com.h"
#include "msgdata/msg_place_name.h"
#include "msgdata/msg_place_name_haihu.h"
#include "poketool/poke_tool.h"
#include "field/sodateya.h"
#include "poketool/poke_memo.h"

#include "application/phclink.h"
#include "phclink_obj_def.h"
#include "phclink_bmp_def.h"
#include "phclink_local.h"
#include "phclink_obj.h"
#include "phclink_bmp.h"
#include "phc_ds.naix"

enum{
	SUBSEQ_SAVE_MSG=0,				///< 通常受信「レポートをかいています…」
	SUBSEQ_SAVE_MSG_WAIT,			///< メッセージ待ち
	SUBSEQ_SAVE_START,				///< セーブ開始
	SUBSEQ_SAVE_WAIT,				///< セーブ待ち
	SUBSEQ_SAVE_END,				///< セーブ終了

	SUBSEQ_PRESENT_SAVE_MSG,		///< プレゼント受信「レポートをかいています…」」
	SUBSEQ_PRESENT_SAVE_MSG_WAIT,	///< メッセージ待ち
	SUBSEQ_PRESENT_SAVE_START,		///< セーブ開始
	SUBSEQ_PRESENT_SAVE_WAIT,		///< セーブ待ち
	SUBSEQ_PRESENT_SAVE_END,		///< セーブ終了

	SUBSEQ_END,						///< 終了
	SUBSEQ_MAX,
};


static int SubSeqSaveMsg( PHCLINK_WORK *wk );
static int SubSeqSaveMsgWait( PHCLINK_WORK *wk );
static int SubSeqSaveStart( PHCLINK_WORK *wk );
static int SubSeqSaveWait( PHCLINK_WORK *wk );
static int SubSeqSaveEnd( PHCLINK_WORK *wk );
static int SubSeqEnd( PHCLINK_WORK *wk );

static int SubSeqPresentSaveMsg( PHCLINK_WORK *wk );
static int SubSeqPresentSaveMsgWait( PHCLINK_WORK *wk );
static int SubSeqPresentSaveStart( PHCLINK_WORK *wk );
static int SubSeqPresentSaveWait( PHCLINK_WORK *wk );
static int SubSeqPresentSaveEnd( PHCLINK_WORK *wk );



static void present_recv_func( PHCLINK_WORK *wk );
static void pokemon_recv_func( PHCLINK_WORK *wk );
static void get_pokemon_func( PHCLINK_WORK *wk, int setBoxFlag );
static void _set_pokemon_infomation(  POKEMON_PARAM *pp, MYSTATUS *mystatus, PHCPokemonBase *pb, int seikaku, int flag);
static void _set_pokemon_base(  POKEMON_PARAM *pp, u32 id, PHCPokemonBase *pb, int seikaku, int flag);
static  int _pokemon_step_levelup( POKEMON_PASO_PARAM *ppp, POKEMON_PARAM *pp, int nowstep );
static void _pokemon_step_natsukiup( POKEMON_PASO_PARAM *ppp, int differ );
static void _ending_check( PHCLINK_WORK *wk );



static int (*SubSeqFuncTbl[])( PHCLINK_WORK *wk )={
	SubSeqSaveMsg,
	SubSeqSaveMsgWait,
	SubSeqSaveStart,
	SubSeqSaveWait,
	SubSeqSaveEnd,

	SubSeqPresentSaveMsg,
	SubSeqPresentSaveMsgWait,
	SubSeqPresentSaveStart,
	SubSeqPresentSaveWait,
	SubSeqPresentSaveEnd,


	SubSeqEnd,

};


//==============================================================================
/**
 * @brief   ポケモン受け取り処理
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  none
 */
//==============================================================================
static void pokemon_recv_func( PHCLINK_WORK *wk )
{
	u16 No, flag,i	;
	int boxNo, boxPos;
	int result=1;

	BOX_DATA *boxdata       = SaveData_GetBoxData( wk->savedata );
	POKEMON_PARAM	   *pp  = PokemonParam_AllocWork( HEAPID_PHC_LINK );
	POKEMON_PASO_PARAM *ppp = PPPPointerGet(pp);

	OS_Printf("DS:entryflag=%d, pokeflag=%d, pokeauto=%d\n",
				wk->phcsys.myStatusDS.entryFlag,wk->phcsys.myStatusDS.pokeFlag,
				wk->phcsys.myStatusDS.pokeAutoGenerateFlag);

	OS_Printf("PHC:entryflag=%d, pokeflag=%d, pokeauto=%d\n",
				wk->phcsys.myStatusPHC.entryFlag,wk->phcsys.myStatusPHC.pokeFlag,
				wk->phcsys.myStatusPHC.pokeAutoGenerateFlag);
	// PHC預けた情報の取得
	PhcSvData_GetDepositInfo( wk->phc_svdata, &flag , &No );

	boxNo  = No;
	boxPos = 0;


	// あずけたポケモンか？
	if(wk->phcsys.myStatusPHC.pokeAutoGenerateFlag==0){

		// PHC用セーブデータからポケモンデータを取り出す
		result = PhcSvData_GetPokemon( wk->phc_svdata, (u8*)ppp );
		// 存在しているならレベルアップ処理を
		if(result){
				// 歩数でレベルアップさせる処理を入れる
			wk->levelup = _pokemon_step_levelup( ppp, pp, wk->step_difference );

		}
		// なつき度アップ処理
		_pokemon_step_natsukiup( ppp, wk->step_difference );
		wk->step_difference = 0;

		// セーブデータ内のポケモン領域をクリア
		PhcSvData_ClearPokemon( wk->phc_svdata );

	}else{
		// ポケモンがPHCの中で自動生成された
		PHCPokemonBase *ppb = &wk->phcsys.Rental.pokemon;

		// ポケモンの基本情報格納
		_set_pokemon_infomation(  pp, wk->mystatus, ppb, gf_mtRand()%24, 0);

		TrainerMemoSetPPP(	PPPPointerGet(pp), wk->mystatus, TRMEMO_POKE_PLACESET, MAPNAME_GS_PHC, HEAPID_PHC_LINK );
		result=1;
	}

	// ポケモンが存在しているなら格納
	if(result){
		// ボックスの空いてる場所を検索
		BOXDAT_GetEmptyTrayNumberAndPos( boxdata, &boxNo, &boxPos );

		// ポケモン格納
		BOXDAT_PutPokemonPos( boxdata, boxNo, boxPos, ppp );

		// 画像展開用にPOKE_PASO_PARAMを確保
		wk->ppp = BOXDAT_GetPokeDataAddress( boxdata, boxNo, boxPos );

		// 図鑑登録（見た＆ゲット）
		ZukanWork_SetPokeSee( wk->zukan, pp);
		ZukanWork_SetPokeGet( wk->zukan, pp);

	}

	OS_Printf("PhcLink_SeqRecvDemo_Init\n");

	// ポケモンデータバッファ解放
	sys_FreeMemoryEz( pp );

}


//----------------------------------------------------------------------------------
/**
 * @brief 歩数でポケモンをレベルアップさせる（最高１レベル分の経験値が入る）
 *
 * @param   ppp		POKEPASO_PARAMポインタ
 * @param   pp		テンポラリとしてのPOKEMON_PARAMバッファ
 * @param   nowstep	取得した歩数
 */
//----------------------------------------------------------------------------------
static int _pokemon_step_levelup( POKEMON_PASO_PARAM *ppp, POKEMON_PARAM *pp, int nowstep )
{
	int result = 0;
	// レベル100以内なら経験値処理をいれる
	if(PokePasoParaGet(ppp, ID_PARA_level, NULL)<100){
		// 歩数　→　経験値処理[DSに残っている現在までの歩数取得]
		// PHC内の歩数-DS内歩数を算出
		int exp,nowexp;

		// マイナスだったら０で扱う
		if(nowstep<0){
			nowstep = 0;
		}

		// 次のレベルに必要な経験値を取得
		exp = PokePasoParaNextLevelExpGet(ppp);
		OS_Printf("step differ=%d\n", nowstep);
		OS_Printf("nextlevel exp=%d\n", exp);

		// 必要経験値に押さえ込む
		if(nowstep>=exp){
			nowstep = exp;
			result  = 1;		// レベルアップした
		}
		nowexp = PokePasoParaGet(ppp, ID_PARA_exp, NULL);
		OS_Printf("now exp=%d\n", nowexp);

		// 歩数を経験値に足しこむ
		nowexp += nowstep;
		OS_Printf("now exp=%d\n", nowexp);

		// レベルアップ計算
		PokeReplace(ppp,pp);								//元のポケモンパラメータを取得
		PokeParaPut( pp, ID_PARA_exp, &nowexp);

		PokeParaCalc(pp);

		// レベルアップ時のなつき度アップ
		if(result){
			OS_Printf("pre natuki = %d, placeId=%d\n", PokeParaGet(pp, ID_PARA_friend,NULL), PokeParaGet(pp,ID_PARA_get_place,NULL));
			FriendCalc( pp, FRIEND_LEVELUP, 8);		// 捕獲方法がどれとも違うようにする
			OS_Printf("layter natuki = %d\n", PokeParaGet(pp, ID_PARA_friend,NULL));
		}
	}

	return result;
}


//----------------------------------------------------------------------------------
/**
 * エンディングフラグチェック
 *
 * @param   wk	PHC画面ワーク
 */
//----------------------------------------------------------------------------------
static void _ending_check( PHCLINK_WORK *wk )
{
	wk->ending_flag = 0;

	// エンディングフラグ確認
	if(wk->phcsys.Data.endingFlag){
		OS_Printf("エンディングフラグがたっている！\n");
		// 今までエンディングを迎えていなかった場合はごほうび
		if(PhcSvData_GetEndingFlag( wk->phc_svdata )==0){
			PhcSvData_SetEndingFlag( wk->phc_svdata );
			// スターの実追加
			MyItem_AddItem( wk->myitem, ITEM_SUTAANOMI, 1, HEAPID_PHC_LINK);
			wk->ending_flag = 1;
			OS_Printf("DSエンディングフラグは%d\n", PhcSvData_GetEndingFlag( wk->phc_svdata ));
		}
	}
}

			// なつき度アップ処理
#define POKEPARA_FRIEND_MAX		( 255 )
#define PHC_STEP_NATSUKI_TERM	( 5000 )

//----------------------------------------------------------------------------------
/**
 * 5000歩以上歩いていたらなつき度アップ
 *
 * @param   ppp		POKEMON_PASO_PARAM
 * @param   differ	歩数
 */
//----------------------------------------------------------------------------------
static void _pokemon_step_natsukiup( POKEMON_PASO_PARAM *ppp, int differ )
{
	u8 natsuki;

	// 5000歩いてるか
	if(differ<PHC_STEP_NATSUKI_TERM){
		return;
	}

	natsuki = PokePasoParaGet(ppp, ID_PARA_friend, NULL);

	// なつき度MAXじゃなければ１上げる
	if( natsuki < POKEPARA_FRIEND_MAX){
		natsuki++;
		PokePasoParaPut( ppp, ID_PARA_friend, &natsuki );
	}
}

//----------------------------------------------------------------------------------
/**
 * @brief	ポケモンの基本情報を格納
 *
 * @param   pp			格納先
 * @param   mystatus	自分の情報
 * @param   pb			PHCから渡される基本情報
 * @param   seikaku		性格乱数
 * @param   flag		レアかどうか（1:レア　0:指定しない）
 */
//----------------------------------------------------------------------------------
static void _set_pokemon_infomation(  POKEMON_PARAM *pp, MYSTATUS *mystatus, PHCPokemonBase *pb, int seikaku, int flag)
{
	STRBUF *strbuf = MyStatus_CreateNameString( mystatus, HEAPID_PHC_LINK);
	u32 id         = MyStatus_GetID( mystatus );

	// PokemonBaseDataからの内容を反映させる
	_set_pokemon_base(  pp, id, pb, seikaku, flag);

	// 親名格納
	PokeParaPut( pp, ID_PARA_oyaname_buf, strbuf );

	STRBUF_Delete( strbuf );

}


//----------------------------------------------------------------------------------
/**
 * @brief	PokemonBaseDataの内容を反映させる処理
 *
 * @param   pp			POKEMON_PARAM
 * @param   id			トレーナーＩＤ
 * @param   pb			PokemonBaseData
 * @param   seikaku		性格数値
 * @param   flag		0:通常	1:レア
 */
//----------------------------------------------------------------------------------
static void _set_pokemon_base(  POKEMON_PARAM *pp, u32 id, PHCPokemonBase *pb, int seikaku, int flag)
{
	u8 form, sex=MONS_MALE;

	form = pb->folm;

	// 性別設定格納（PHCではメスは1だが、ポケモンでは254なので格納しなおす）
	if(pb->sex==1){
		sex  = MONS_FEMALE;
	}

	// GF495【ポケウォーカーで入手したポケモンの個体乱数について】
	// PokeParaSetSexChrを使うと個体乱数が偏ってしまうため、
	// レアカラーでない場合もPokeParaCalcPersonalRndを使うことで対処 09.06.26 by hosaka genya
#if 0
	if(flag){
		u32 rnd = PokeParaCalcPersonalRnd( id, pb->id, seikaku, sex, gf_mtRand()%2, PARA_RARE );
		PokeParaSet( pp, pb->id, pb->level, POW_RND, RND_SET, rnd, ID_SET, id);
	}else{
		PokeParaPut( pp, ID_PARA_id_no, &id );
		PokeParaSetSexChr( pp, pb->id, pb->level, POW_RND, sex, seikaku, 0);
	}
#else
	{
		u8 tokusei;
		u32 rnd;

		tokusei = ( seikaku & 1 ); ///< 性格と特性の奇数、偶数は一致したものしか作れない(性格の1bit目と特性は一致させる必要がある)
		rnd = PokeParaCalcPersonalRnd( id, pb->id, seikaku, sex, tokusei, flag );

		PokeParaSet( pp, pb->id, pb->level, POW_RND, RND_SET, rnd, ID_SET, id );
	}
#endif

	PokeParaPut( pp, ID_PARA_item,  &(pb->item) );
	PokeParaPut( pp, ID_PARA_waza1, &(pb->skill[0]) );
	PokeParaPut( pp, ID_PARA_waza2, &(pb->skill[1]) );
	PokeParaPut( pp, ID_PARA_waza3, &(pb->skill[2]) );
	PokeParaPut( pp, ID_PARA_waza4, &(pb->skill[3]) );
	PokeParaPut( pp, ID_PARA_form_no, &form );

	OS_Printf("auto poke id=%d\n", PokeParaGet(pp, ID_PARA_id_no, NULL));

}

//------------------------------------------------------------------
/**
 * @brief   プレゼント受け取り処理
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void present_recv_func( PHCLINK_WORK *wk )
{
	int i;
	// 手に入れたアイテムを格納
	for(i=0;i<3;i++){
		if(wk->phcsys.Data.item[i].ID!=0){
			MyItem_AddItem( wk->myitem, wk->phcsys.Data.item[i].ID, 1, HEAPID_PHC_LINK);
		}
	}
	// 友達からの通信で手に入れた道具
	for(i=0;i<10;i++){
		if(wk->phcsys.Data.itemFriend[i].ID!=0){
			MyItem_AddItem( wk->myitem, wk->phcsys.Data.itemFriend[i].ID, 1, HEAPID_PHC_LINK);
		}
	}
	// 配布アイテムが入っているのであれば取得
	if(wk->phcsys.Distribute.info.isItem){
		MyItem_AddItem( wk->myitem, wk->phcsys.Distribute.item.itemNumber, 1, HEAPID_PHC_LINK );

	}

}


//------------------------------------------------------------------
/**
 * @brief   基本ポケモンパラメータセット
 *
 * @param   pp		ポケモンパラメータ構造体
 * @param   pb		PHC内ポケモン基本パラメータ
 * @param   str		親名
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void _basic_auto_pokemon_set( POKEMON_PARAM *pp, PHCPokemonBase *pb, STRBUF *str )
{
	PokeParaInit( pp );
	PokeParaSet(pp,pb->id,pb->level,POW_RND,RND_NO_SET,0,ID_NO_SET,0);
	PokeParaPut(pp,ID_PARA_waza1, &pb->skill[0]);
	PokeParaPut(pp,ID_PARA_waza2, &pb->skill[1]);
	PokeParaPut(pp,ID_PARA_waza3, &pb->skill[2]);
	PokeParaPut(pp,ID_PARA_waza4, &pb->skill[3]);
	PokeParaPut(pp,ID_PARA_oyaname_buf, str);

}


// 配布ポケモンのデバッグ格納
#if 1
static void _debug_set( PHCLINK_WORK *wk )
{
	wk->phcsys.Distribute.info.isPokemon = 1;
	wk->phcsys.Distribute.pokemon.pokeInfo.parentName[0] = a_;
	wk->phcsys.Distribute.pokemon.pokeInfo.parentName[1] = 0;
	wk->phcsys.Distribute.pokemon.pokeInfo.parentName[2] = a_;
	wk->phcsys.Distribute.pokemon.pokeInfo.parentName[3] = 0;
	wk->phcsys.Distribute.pokemon.pokeInfo.parentName[4] = 0xff;
	wk->phcsys.Distribute.pokemon.pokeInfo.parentName[5] = 0xff;
	wk->phcsys.Distribute.pokemon.pokemon.id = 4;
	wk->phcsys.Distribute.pokemon.pokemon.level	= 10;
	wk->phcsys.Distribute.pokemon.pokemon.rareColor = 1;
	wk->phcsys.Distribute.pokemon.pokeInfo.getBall = 1;
}
#endif


//------------------------------------------------------------------
/**
 * @brief   捕まえてきたポケモンを格納
 *
 * @param   wk			PHC画面ワーク
 * @param   setBoxFlag	1:ポケモンの預け情報からＢＯＸを得る	1:得ない
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void get_pokemon_func( PHCLINK_WORK *wk, int setBoxFlag )
{
	PHCPokemonBase *pb;
	BOX_DATA *boxdata       = SaveData_GetBoxData( wk->savedata );
	POKEMON_PARAM	   *pp  = PokemonParam_AllocWork( HEAPID_PHC_LINK );
	POKEMON_PASO_PARAM *ppp;
	STRBUF *str = MyStatus_CreateNameString( wk->mystatus, HEAPID_PHC_LINK );
	int boxNo, boxPos;
	u16 flag,no;
	int i;

	PhcSvData_GetDepositInfo( wk->phc_svdata, &flag, &no );
	if(setBoxFlag){
		boxNo  = no;
	}else{
		boxNo   = 0;
	}
	boxPos = 0;

	// 通常の捕獲ポケモン(最高３匹）
	for(i=0;i<3;i++){
		pb = &wk->phcsys.Data.pokemon[i];
		if(pb->id!=0){

			// ポケモンの基本情報格納
			_set_pokemon_infomation(  pp, wk->mystatus, pb, gf_mtRand()%24, 0);

			TrainerMemoSetPPP(	PPPPointerGet(pp), wk->mystatus, TRMEMO_POKE_PLACESET, MAPNAME_GS_PHC, HEAPID_PHC_LINK );

//			_basic_auto_pokemon_set( pp, pb, str );
			ppp = PPPPointerGet(pp);
			// ボックスの空いてる場所を検索
			BOXDAT_GetEmptyTrayNumberAndPos( boxdata, &boxNo, &boxPos );
			BOXDAT_PutPokemonPos( boxdata, boxNo, boxPos, ppp );

			// 図鑑登録
			ZukanWork_SetPokeSee( wk->zukan, pp);
			ZukanWork_SetPokeGet( wk->zukan, pp);

		}
	}

	{
		PHCDistributeData *d = &wk->phcsys.Distribute;
		OS_Printf("distribute stamp=%d, map=%d, pokemon=%d, item=%d\n",d->info.stamp, d->info.isMap, d->info.isPokemon, d->info.isItem);
		OS_Printf("poke =%d, item=%d, level=%d\n", d->pokemon.pokemon.id, d->pokemon.pokemon.item, d->pokemon.pokemon.level);
		OS_Printf("item =%d\n", d->item.itemNumber);
	}
	// 配布ポケモンが存在していれば格納

	if(wk->phcsys.Distribute.info.isPokemon){
		STRBUF *oyaname = STRBUF_Create( (PERSON_NAME_SIZE+EOM_SIZE)*2, HEAPID_PHC_LINK );
		pb = &wk->phcsys.Distribute.pokemon.pokemon;
		if(pb->id!=0){
			STRBUF_SetStringCode( oyaname, (STRCODE*)wk->phcsys.Distribute.pokemon.pokeInfo.parentName );
			// ポケモンの情報セット
			PokeParaInit( pp );
			ppp = PPPPointerGet(pp);


			// ポケモンの基本情報格納
			_set_pokemon_base(  pp, wk->phcsys.Distribute.pokemon.pokeInfo.parentId, pb, gf_mtRand()%24, pb->rareColor );
			{
				// 親の性別
				u8 oyasex = wk->phcsys.Distribute.pokemon.pokeInfo.parentSex;
				PokePasoParaPut( ppp, ID_PARA_oyasex, &oyasex );
			}
			// 親の名前
			PokePasoParaPut( ppp, ID_PARA_oyaname_buf, oyaname );
			// トレーナーメモ
			TrainerMemoSetPPP(	PPPPointerGet(pp), wk->mystatus, TRMEMO_FUSHIGI_PLACESET,
								wk->phcsys.Distribute.pokemon.pokeInfo.country_poke, HEAPID_PHC_LINK );


			// とくせい
			PokePasoParaPut( ppp, ID_PARA_speabino, &wk->phcsys.Distribute.pokemon.pokeInfo.characteristic );


			// 配布フラグＯＮ
			{
				u8 flag = 1;
				PokePasoParaPut( ppp, ID_PARA_event_get_flag, &flag );
			}

			OS_Printf( "event place country = %d, eggCoutry = %d\n",
							wk->phcsys.Distribute.pokemon.pokeInfo.country_poke,
							wk->phcsys.Distribute.pokemon.pokeInfo.eggCountry);
			// 捕獲ボール
			PokePasoParaPut( ppp, ID_PARA_get_ball, &wk->phcsys.Distribute.pokemon.pokeInfo.getBall);

			OS_Printf("event flag=%d\n", PokePasoParaGet( ppp, ID_PARA_event_get_flag, NULL ));

			// ボックスの空いてる場所を検索
			BOXDAT_GetEmptyTrayNumberAndPos( boxdata, &boxNo, &boxPos );
			BOXDAT_PutPokemonPos( boxdata, boxNo, boxPos, ppp );

			// 図鑑登録
			ZukanWork_SetPokeSee( wk->zukan, pp);
			ZukanWork_SetPokeGet( wk->zukan, pp);


			// 画像展開用にPOKE_PASO_PARAMを確保
			if(wk->ppp==NULL){
				// ※pppがNULLじゃないときは預けたポケモンも受け取っているので代入しない
				wk->ppp = BOXDAT_GetPokeDataAddress( boxdata, boxNo, boxPos );
			}
		}
		STRBUF_Delete(oyaname);
	}

	STRBUF_Delete(str);
	// ポケモンデータバッファ解放
	sys_FreeMemoryEz( pp );

}


//==============================================================================
/**
 * @brief   取得したポケモン・どうぐの格納処理（phclink_senddemo.c用）
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  none
 */
//==============================================================================
void PhcLink_GetPokeItemFunc( PHCLINK_WORK *wk )
{
	//
	get_pokemon_func(wk, 1);
	present_recv_func( wk );
	_ending_check( wk );

}

//==============================================================================
/**
 * @brief   受信時各処理呼び出し
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval
 */
//==============================================================================
int PhcLink_SeqRecvDemo_Init( PHCLINK_WORK *wk )
{
	// 通常のポケモン受け取り
	wk->ppp = NULL;
	if(wk->subseq_flag==SENDRECV_RECV){
		pokemon_recv_func( wk );
		get_pokemon_func(wk, 1);
		present_recv_func( wk );
		_ending_check( wk );

		// 自動生成ポケモンがいない場合は
		if(wk->phcsys.myStatusPHC.pokeAutoGenerateFlag==0){
			// PHCに引き取った情報を書き込み
			PhcSvData_SetDepositInfo( wk->phc_svdata, PHC_NO_DEPSIT , 0 );
		}
		// ポケモンがいる
		if(wk->ppp!=NULL){
			PhcLink_TransPokeGra( wk->ppp, wk->PokeGra, &wk->PokeGraSsa, 0 );	// ポケモン画像展開
			PhcLink_BlendPokeInit( wk );
			PhcLinkObj_PokeLumpDisappear( wk );
			wk->pokelump.move = 0;
			Snd_MePlay( SEQ_ME_KEYITEM );

		// 空だった
		}else{
			PhcLinkObj_PokeLumpDisappear( wk );
			wk->blend_rate = 31;
		}

		PhcLink_OpenCourseCheck( wk );			// 獲得ワットでコースがオープンするかチェック
		wk->subseq = SUBSEQ_SAVE_MSG;

	// プレゼント受け取り
	}else if(wk->subseq_flag==SENDRECV_RECV_PRESENT){
		present_recv_func( wk );
		get_pokemon_func(wk, 0);
		wk->subseq = SUBSEQ_PRESENT_SAVE_MSG;

	// 強制送還
	}else if(wk->subseq_flag==RECVDEMO_OBLIGATE_RECV){
		pokemon_recv_func( wk );
		PhcLink_TransPokeGra( wk->ppp, wk->PokeGra, &wk->PokeGraSsa, 0 );	// ポケモン画像展開
		PhcLink_BlendPokeInit( wk );
		wk->subseq = SUBSEQ_SAVE_MSG;

		// PHCに引き取った情報を書き込み
		PhcSvData_SetDepositInfo( wk->phc_svdata, PHC_NO_DEPSIT , 0 );

	}


	// 各種データ格納は終わっているので自動生成フラグをクリア
	wk->phcsys.myStatusPHC.pokeAutoGenerateFlag=0;

	return SEQ_MAINSEQ_MAIN;
}

//==============================================================================
/**
 * @brief   受信デモメイン
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		アプリシーケンス
 */
//==============================================================================
int PhcLink_SeqRecvDemo_Main( PHCLINK_WORK *wk )
{

	wk->subseq = SubSeqFuncTbl[wk->subseq]( wk );
	if(wk->subseq == SUBSEQ_MAX){
		wk->subseq  = 0;
		return SEQ_MAINSEQ_END;
	}
	return SEQ_MAINSEQ_MAIN;
}
//==============================================================================
/**
 * @brief   受信デモ画面終了
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		アプリシーケンス
 */
//==============================================================================
int PhcLink_SeqRecvDemo_End( PHCLINK_WORK *wk )
{
	PhcLinkObj_Disappear( wk, PLOBJ_ID_POKEMON_D );
	OS_Printf("PhcLink_SeqRecvDemo_End\n");

	return SEQ_MAINSEQ_INIT;
}



//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================


//------------------------------------------------------------------
/**
 * @brief   送信処理シーケンス開始レポートにかきこんでいますでんげんをきらないでください」
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqSaveMsg( PHCLINK_WORK *wk )
{
	// 「レポートにかきこんでいますでんげんをきらないでください」
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_TALK, phc_ds_msg_14 );
	PhcLinkObj_PhcAppear( wk, 0 );
	return SUBSEQ_SAVE_MSG_WAIT;
}


//------------------------------------------------------------------
/**
 * @brief   メッセージ表示待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqSaveMsgWait( PHCLINK_WORK *wk )
{
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0 && wk->blend_rate==31 && Snd_MePlayCheck()==FALSE){
		Snd_MePlayCheckBgmPlay();
		PhcLinkBmp_TimeWaitIconPut( wk );
//	    rsw->TimeWaitIconPtr = TimeWaitIconAdd( &rsw->TalkWinBmp , TALK_WINDOW_CGX);

#ifdef PHC_NO_SAVE
		return SUBSEQ_SAVE_WAIT;
#else
		return SUBSEQ_SAVE_START;
#endif
	}
	return SUBSEQ_SAVE_MSG_WAIT;
}

//------------------------------------------------------------------

//------------------------------------------------------------------
/**
 * @brief   セーブ開始
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqSaveStart( PHCLINK_WORK *wk )
{
	SaveData_Save( wk->savedata );
	SaveData_ResetLoadResult(wk->savedata);

	return SUBSEQ_SAVE_WAIT;
}

//------------------------------------------------------------------
/**
 * @brief   セーブ終了（待ちアイコン消去）
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqSaveWait( PHCLINK_WORK *wk )
{
	PhcLinkBmp_TimeWaitIconDel( wk );
	return SUBSEQ_SAVE_END;

}

//------------------------------------------------------------------
/**
 * @brief   セーブ終了
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqSaveEnd( PHCLINK_WORK *wk )
{
	// 日記画面へ

	if(wk->subseq_flag==RECVDEMO_OBLIGATE_RECV){
		wk->mainseq_next = MAINSEQ_START;
	}else{
		wk->mainseq_next = MAINSEQ_DIARY;
	}
	return SUBSEQ_END;
}



//------------------------------------------------------------------
/**
 * @brief   プレゼント受信セーブメッセージ表示
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqPresentSaveMsg( PHCLINK_WORK *wk )
{
	// 「レポートにかきこんでいますでんげんをきらないでください」
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_TALK, phc_ds_msg_14 );
	PhcLinkObj_PhcAppear( wk, 0 );
	return SUBSEQ_PRESENT_SAVE_MSG_WAIT;

}


//------------------------------------------------------------------
/**
 * @brief   プレゼント受信終了メッセージ待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqPresentSaveMsgWait( PHCLINK_WORK *wk )
{
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0){

		PhcLinkBmp_TimeWaitIconPut( wk );
//	    rsw->TimeWaitIconPtr = TimeWaitIconAdd( &rsw->TalkWinBmp , TALK_WINDOW_CGX);

#ifdef PHC_NO_SAVE
		return SUBSEQ_PRESENT_SAVE_WAIT;
#else
		return SUBSEQ_PRESENT_SAVE_START;
#endif
	}
	return SUBSEQ_PRESENT_SAVE_MSG_WAIT;

}


//------------------------------------------------------------------
/**
 * @brief   プレゼント受信セーブ開始
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqPresentSaveStart( PHCLINK_WORK *wk )
{
	SaveData_Save( wk->savedata );
	SaveData_ResetLoadResult(wk->savedata);

	return SUBSEQ_PRESENT_SAVE_WAIT;

}

//------------------------------------------------------------------
/**
 * @brief   プレゼント受信セーブ待ちアイコン表示開始
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqPresentSaveWait( PHCLINK_WORK *wk )
{
	PhcLinkBmp_TimeWaitIconDel( wk );
	return SUBSEQ_PRESENT_SAVE_END;

}


//------------------------------------------------------------------
/**
 * @brief   プレゼント受信セーブ終了
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqPresentSaveEnd( PHCLINK_WORK *wk )
{
	// プレゼント受け取りの時は直接報酬画面へ
	wk->mainseq_next = MAINSEQ_BENEFIT;
	return SUBSEQ_END;
}



//------------------------------------------------------------------
/**
 * @brief   受信デモアプリ終了
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqEnd( PHCLINK_WORK *wk )
{
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME1_M );

	PhcLinkObj_Disappear( wk, PLOBJ_ID_TRESURE );
	return SUBSEQ_MAX;

}